Quick initial exploration of main characteristics from the German skills matrices. The dataset used in this case is the ‘occ_SUF.DTA’, a 3-digit occupation matrix.

Reading the data into a network object:

library(foreign)
library(igraph)

Attaching package: ‘igraph’

The following objects are masked from ‘package:stats’:

    decompose, spectrum

The following object is masked from ‘package:base’:

    union
# read data
data_occ_SUF <- data.frame(read.dta("../data/MR_04-17_EN_data_GermanySkillsMatrix/occ_SUF.DTA"))
# select edges where the flow is higher than random
data_occ_SUF_df <- data_occ_SUF[data_occ_SUF$SRt>0,]

Top 20 flows:

library(knitr)
top_occ_SUF_df <- data_occ_SUF_df[order(-data_occ_SUF_df$SRt),]
kable(top_occ_SUF_df[top_occ_SUF_df$SRt!=1,][1:20,])
occ_SUF_1 occ_SUF_2 SRt
13070 Home wardens, social work teachers Nursery teachers, child nurses 0.9806
13189 Nursery teachers, child nurses Home wardens, social work teachers 0.9775
1089 Special printers, screeners until printer s assistants Type setters, compositors until printers (flat, gravure) 0.9732
12226 Physicians until Pharmacists Dietary assistants, pharmaceutical assistants until medical laboratory assistants 0.9713
12702 Dietary assistants, pharmaceutical assistants until medical laboratory assistants Physicians until Pharmacists 0.9682
12584 Nursing assistants Nurses, midwives 0.9624
970 Type setters, compositors until printers (flat, gravure) Special printers, screeners until printer s assistants 0.9609
12707 Dietary assistants, pharmaceutical assistants until medical laboratory assistants Medical receptionists 0.9511
12674 Dietary assistants, pharmaceutical assistants until medical laboratory assistants Publishing house dealers, booksellers until service-station attendants 0.9507
12944 Social workers, care workers until religious care helpers Nurses, midwives 0.9503
11981 Musicians until scenery/sign painters Artistic and assisting occupations (stage, video and audio) until performers, professional sportsmen, auxiliary artistic occupations 0.9457
8230 Biological specialists until physical and mathematical specialists Chemical laboratory assistants until photo laboratory assistants 0.9449
12465 Nurses, midwives Nursing assistants 0.9448
12100 Artistic and assisting occupations (stage, video and audio) until performers, professional sportsmen, auxiliary artistic occupations Musicians until scenery/sign painters 0.9443
12949 Social workers, care workers until religious care helpers Home wardens, social work teachers 0.9426
6292 Goods painters, lacquerers until ceramics/glass painters Painters, lacquerers (construction) 0.9422
12826 Medical receptionists Dietary assistants, pharmaceutical assistants until medical laboratory assistants 0.9414
12468 Nurses, midwives Social workers, care workers until religious care helpers 0.9406
13068 Home wardens, social work teachers Social workers, care workers until religious care helpers 0.9394
12588 Nursing assistants Social workers, care workers until religious care helpers 0.9371

#build the graph
occ_SUF_net <- graph_from_data_frame(data_occ_SUF_matrix)
# network object
occ_SUF_net
IGRAPH ddfe691 DN-- 120 3773 -- 
+ attr: name (v/c), SRt (e/n)
+ edges from ddfe691 (vertex names):
[1] Farmers until animal keepers and related occupations->Farmers until animal keepers and related occupations                    
[2] Farmers until animal keepers and related occupations->Gardeners, garden workers until forest workers, forest cultivators      
[3] Farmers until animal keepers and related occupations->Miners until shaped brick/concrete block makers                         
[4] Farmers until animal keepers and related occupations->Wood preparers until basket and wicker products makers                  
[5] Farmers until animal keepers and related occupations->Agricultural machinery repairers until precision mechanics              
[6] Farmers until animal keepers and related occupations->Butchers until fish processing operatives                               
[7] Farmers until animal keepers and related occupations->Cooks until ready-to-serve meals, fruit, vegetable preservers, preparers
[8] Farmers until animal keepers and related occupations->Wine coopers until sugar, sweets, ice-cream makers                      
+ ... omitted several edges
V(occ_SUF_net)       # The vertices of the "occ_SUF_net" object
+ 120/120 vertices, named, from ddfe691:
  [1] Farmers until animal keepers and related occupations                                                                                
  [2] Gardeners, garden workers until forest workers, forest cultivators                                                                  
  [3] Miners until shaped brick/concrete block makers                                                                                     
  [4] Ceramics workers until glass processors, glass finishers                                                                            
  [5] Chemical plant operatives                                                                                                           
  [6] Chemical laboratory workers until vulcanisers                                                                                       
  [7] Plastics processors                                                                                                                 
  [8] Paper, cellulose makers until other paper products makers                                                                           
  [9] Type setters, compositors until printers (flat, gravure)                                                                            
 [10] Special printers, screeners until printer s assistants                                                                              
+ ... omitted several vertices

Network and node descriptives

The proportion of present edges from all possible edges in the network.

edge_density(occ_SUF_net, loops=F)
[1] 0.2642157

The proportion of reciprocated ties.

reciprocity(occ_SUF_net)
[1] 0.9050096

Trasitivity (clustering): measures that probability that adjacent nodes of a network are connected. In other words, if i is connected to j, and j is connected to k, what is the probability that i is also connected to k?

transitivity(occ_SUF_net, type="global")  # net is treated as an undirected network
[1] 0.5701134

Diameter (length of the shortest path between two nodes) in the network, get_diameter() returns the nodes along the first found path of that distance.

diameter(occ_SUF_net, directed=F, weights=NA)
[1] 3
get_diameter(occ_SUF_net, directed=F, weights=NA) 
+ 4/120 vertices, named, from ddfe691:
[1] Gardeners, garden workers until forest workers, forest cultivators Farmers until animal keepers and related occupations              
[3] Agricultural machinery repairers until precision mechanics         Mechanical engineering technicians                                

Node degrees: the number of adjacent edges to each node.

deg <- degree(occ_SUF_net, mode="all")
# Ocuppations with higher incoming/outgoing flows
print (sort(deg)[1:10])
                                            Nurses, midwives                           Home wardens, social work teachers 
                                                          26                                                           27 
                                  Others attending on guests                                  Forwarding business dealers 
                                                          28                                                           30 
                              Nursery teachers, child nurses                  Cost accountants, valuers until accountants 
                                                          31                                                           33 
Stenographers, shorthand-typists, typists until data typists    Social workers, care workers until religious care helpers 
                                                          33                                                           34 
    Type setters, compositors until printers (flat, gravure)          Bank specialists until building society specialists 
                                                          36                                                           37 
# Ocuppations with lowest incoming/outgoing flows
print (sort(-deg)[1:10])
                                                                              Chemical plant operatives 
                                                                                                   -110 
                                                                  Assistants (no further specification) 
                                                                                                   -109 
Iron, metal producers, melters until semi-finished product fettlers and other mould casting occupations 
                                                                                                   -105 
                                                                       Goods examiners, sorters, n.e.c. 
                                                                                                   -104 
                                                                                  Motor vehicle drivers 
                                                                                                   -104 
          Street cleaners, refuse disposers until machinery, container cleaners and related occupations 
                                                                                                   -104 
                                                                                    Plastics processors 
                                                                                                   -102 
                                                               Metal workers (no further specification) 
                                                                                                   -102 
                                                                                       Other assemblers 
                                                                                                    -99 
                                                        Miners until shaped brick/concrete block makers 
                                                                                                    -97 
hist(deg,  main="Network Node degree",)

Degree distribution

deg.dist <- degree_distribution(occ_SUF_net, cumulative=T, mode="all")
plot( x=0:max(deg), y=1-deg.dist, pch=19, cex=1.2, col="orange",  xlab="Degree", ylab="Cumulative Frequency")

Strength is a weighted measure of degree that takes into account the number of edges that go from one node to another.

In this example we use the mode “out”, showing the number of job changes leaving the occupation.

sort(strength(occ_SUF_net,mode="out"))[1:5]
                                         Nurses, midwives                        Home wardens, social work teachers 
                                                       14                                                        14 
                               Others attending on guests                               Forwarding business dealers 
                                                       14                                                        15 
Social workers, care workers until religious care helpers 
                                                       15 
sort(-strength(occ_SUF_net))[1:5]
                                                                              Chemical plant operatives 
                                                                                                   -110 
                                                                  Assistants (no further specification) 
                                                                                                   -109 
Iron, metal producers, melters until semi-finished product fettlers and other mould casting occupations 
                                                                                                   -105 
                                                                       Goods examiners, sorters, n.e.c. 
                                                                                                   -104 
                                                                                  Motor vehicle drivers 
                                                                                                   -104 
hist(centr_degree(occ_SUF_net, mode="in", normalized=T)$res,  main='Centrality',xlab="Node Centrality")

centr_degree(occ_SUF_net, mode="in", normalized=T)
$res
  [1]  59  76  97  96 110  92 102  91  36  72  90 105  87  61  54  76  93  55  57  52  71  83  69  69  70  73  70  60  56  79  50  47  76  99 102
 [36]  78  72  73  69  52  90  55  48  64  38  46  72  51  56  70  66  66  62 104  83 109  63  85  43  49  44  48  50  59  46  64  70  81  60  57
 [71]  38  39  64  43  53  37  46  30  57  49 104  55  41  63  59  96  69  40  55  33  42  64  75  33  57  81  70  54  61  57  52  45  40  26  37
[106]  43  49  34  27  31  57  61  64  67  44  28  57  64  73 104

$centralization
[1] 0.3959384

$theoretical_max
[1] 14280

Eigenvector (centrality proportional to the sum of connection centralities), is a measure of being well-connected connected to the well-connected. Values of the first eigenvector of the graph matrix.

hist(centr_eigen(occ_SUF_net, directed=T, normalized=T)$vector,  main='Eigenvector Centrality',xlab="Node Eigenvector Centrality")

Closeness (centrality based on distance to others in the graph), measures how many steps are required to access every other node from a given node. It’s a measure of how long information takes to arrive. Higher values mean less centrality. Inverse of the node’s average geodesic distance to others in the network.

centr_clo(occ_SUF_net, mode="all", normalized=T) 
$res
  [1] 0.5748792 0.5509259 0.6071429 0.6010101 0.6648045 0.6230366 0.6165803 0.6010101 0.5265487 0.5891089 0.5586854 0.6134021 0.5776699
 [14] 0.5483871 0.5173913 0.5458716 0.5979899 0.4958333 0.5042373 0.5265487 0.5833333 0.5586854 0.5560748 0.5534884 0.5891089 0.5776699
 [27] 0.5748792 0.5509259 0.5721154 0.6040609 0.5639810 0.5509259 0.5920398 0.5920398 0.5891089 0.5891089 0.5950000 0.5950000 0.5920398
 [40] 0.5534884 0.6102564 0.5433790 0.4857143 0.5288889 0.4666667 0.4979079 0.5336323 0.4917355 0.5063830 0.5804878 0.5748792 0.5458716
 [53] 0.5483871 0.6329787 0.5950000 0.6102564 0.5360360 0.6040609 0.5151515 0.5312500 0.5312500 0.5312500 0.5288889 0.5666667 0.5384615
 [66] 0.5920398 0.5891089 0.6165803 0.5748792 0.5776699 0.5085470 0.5042373 0.5721154 0.5458716 0.5336323 0.4541985 0.4798387 0.5173913
 [79] 0.5483871 0.5586854 0.6467391 0.5666667 0.5458716 0.5666667 0.5384615 0.6040609 0.5639810 0.4559387 0.5063830 0.4541985 0.5360360
 [92] 0.5242291 0.5534884 0.4541985 0.5666667 0.6230366 0.6134021 0.5776699 0.5173913 0.5586854 0.5613208 0.4779116 0.4958333 0.4296029
[105] 0.4979079 0.5196507 0.5219298 0.5129310 0.4722222 0.4837398 0.5219298 0.5776699 0.5384615 0.5950000 0.5360360 0.4917355 0.5586854
[118] 0.5613208 0.5804878 0.6263158

$centralization
[1] 0.2271654

$theoretical_max
[1] 59.24895
hist(centr_clo(occ_SUF_net, mode="all", normalized=T)$res,  main='Centrality scores',xlab="The node-level centrality scores.")

# All centralisation types
centr_degree(occ_SUF_net)$centralization
[1] 0.3959384
centr_clo(occ_SUF_net, mode = "all")$centralization
[1] 0.2271654
centr_betw(occ_SUF_net, directed = FALSE)$centralization
[1] 0.02800183
centr_eigen(occ_SUF_net, directed = FALSE)$centralization
[1] 0.5825057

LS0tCnRpdGxlOiAiRXhwbG9yYXRpb24gb2YgR2VybWFuIFNraWxscyBtYXRyaWNlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUXVpY2sgaW5pdGlhbCBleHBsb3JhdGlvbiBvZiBtYWluIGNoYXJhY3RlcmlzdGljcyBmcm9tIHRoZSBHZXJtYW4gc2tpbGxzIG1hdHJpY2VzLiBUaGUgZGF0YXNldCB1c2VkIGluIHRoaXMgY2FzZSBpcyB0aGUgJ29jY19TVUYuRFRBJywgYSAzLWRpZ2l0IG9jY3VwYXRpb24gbWF0cml4LiAKClJlYWRpbmcgdGhlIGRhdGEgaW50byBhIG5ldHdvcmsgb2JqZWN0OgpgYGB7cn0KbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGlncmFwaCkKCiMgcmVhZCBkYXRhCmRhdGFfb2NjX1NVRiA8LSBkYXRhLmZyYW1lKHJlYWQuZHRhKCIuLi9kYXRhL01SXzA0LTE3X0VOX2RhdGFfR2VybWFueVNraWxsc01hdHJpeC9vY2NfU1VGLkRUQSIpKQoKIyBzZWxlY3QgZWRnZXMgd2hlcmUgdGhlIGZsb3cgaXMgaGlnaGVyIHRoYW4gcmFuZG9tCmRhdGFfb2NjX1NVRl9kZiA8LSBkYXRhX29jY19TVUZbZGF0YV9vY2NfU1VGJFNSdD4wLF0KCmBgYApUb3AgMjAgZmxvd3M6CgpgYGB7cn0KCmxpYnJhcnkoa25pdHIpCgp0b3Bfb2NjX1NVRl9kZiA8LSBkYXRhX29jY19TVUZfZGZbb3JkZXIoLWRhdGFfb2NjX1NVRl9kZiRTUnQpLF0KCmthYmxlKHRvcF9vY2NfU1VGX2RmW3RvcF9vY2NfU1VGX2RmJFNSdCE9MSxdWzE6MjAsXSkKCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTgsIGVjaG89RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KGRhdGEgPSB0b3Bfb2NjX1NVRl9kZiwgYWVzKHg9b2NjX1NVRl8xLCB5PW9jY19TVUZfMiwgZmlsbD1TUnQpKSArIAogIGdlb21fdGlsZSgpICsgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAib3JhbmdlIiwgICAgIGhpZ2ggPSAiZGFya29yYW5nZTQiKSArICAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5MjAiLCBzaXplID0gNi4yLCBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gLjUsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5MjAiLCBzaXplID0gNi4yLCBhbmdsZSA9IDAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLCBmYWNlID0gInBsYWluIiksICAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JleTIwIiwgc2l6ZSA9Ni4yLCBhbmdsZSA9IDQ1LCBoanVzdCA9IC41LCB2anVzdCA9IDAsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JleTIwIiwgc2l6ZSA9IDYuMiwgYW5nbGUgPSA0NSwgaGp1c3QgPSAuNSwgdmp1c3QgPSAuNSwgZmFjZSA9ICJwbGFpbiIpCiAgKQoKIApgYGAKCgoKCmBgYHtyfQojYnVpbGQgdGhlIGdyYXBoCgpvY2NfU1VGX25ldCA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUodG9wX29jY19TVUZfZGYsZGlyZWN0ZWQgPSBGQUxTRSkKYGBgCgpgYGB7cn0KIyBuZXR3b3JrIG9iamVjdApvY2NfU1VGX25ldAoKYGBgCgpgYGB7cn0KVihvY2NfU1VGX25ldCkgICAgICAgIyBUaGUgdmVydGljZXMgb2YgdGhlICJvY2NfU1VGX25ldCIgb2JqZWN0CgpgYGAKCiMjIE5ldHdvcmsgYW5kIG5vZGUgZGVzY3JpcHRpdmVzCgogVGhlIHByb3BvcnRpb24gb2YgcHJlc2VudCBlZGdlcyBmcm9tIGFsbCBwb3NzaWJsZSBlZGdlcyBpbiB0aGUgbmV0d29yay4KCmBgYHtyfQplZGdlX2RlbnNpdHkob2NjX1NVRl9uZXQsIGxvb3BzPUYpCmBgYApUaGUgcHJvcG9ydGlvbiBvZiByZWNpcHJvY2F0ZWQgdGllcy4KCmBgYHtyfQpyZWNpcHJvY2l0eShvY2NfU1VGX25ldCkKYGBgClRyYXNpdGl2aXR5IChjbHVzdGVyaW5nKTogbWVhc3VyZXMgdGhhdCBwcm9iYWJpbGl0eSB0aGF0IGFkamFjZW50IG5vZGVzIG9mIGEgbmV0d29yayBhcmUgY29ubmVjdGVkLiBJbiBvdGhlciB3b3JkcywgaWYgaSBpcyBjb25uZWN0ZWQgdG8gaiwgYW5kIGogaXMgY29ubmVjdGVkIHRvIGssIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgaSBpcyBhbHNvIGNvbm5lY3RlZCB0byBrPwpgYGB7cn0KdHJhbnNpdGl2aXR5KG9jY19TVUZfbmV0LCB0eXBlPSJnbG9iYWwiKSAgIyBuZXQgaXMgdHJlYXRlZCBhcyBhbiB1bmRpcmVjdGVkIG5ldHdvcmsKYGBgCgpEaWFtZXRlciAobGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBwYXRoIGJldHdlZW4gdHdvIG5vZGVzKSBpbiB0aGUgbmV0d29yaywgZ2V0X2RpYW1ldGVyKCkgcmV0dXJucyB0aGUgbm9kZXMgYWxvbmcgdGhlIGZpcnN0IGZvdW5kIHBhdGggb2YgdGhhdCBkaXN0YW5jZS4KCmBgYHtyfQpkaWFtZXRlcihvY2NfU1VGX25ldCwgZGlyZWN0ZWQ9Riwgd2VpZ2h0cz1OQSkKCmdldF9kaWFtZXRlcihvY2NfU1VGX25ldCwgZGlyZWN0ZWQ9Riwgd2VpZ2h0cz1OQSkgCgpgYGAKCk5vZGUgZGVncmVlczogdGhlIG51bWJlciBvZiBhZGphY2VudCBlZGdlcyB0byBlYWNoIG5vZGUuIApgYGB7cn0KZGVnIDwtIGRlZ3JlZShvY2NfU1VGX25ldCwgbW9kZT0iYWxsIikKCiMgT2N1cHBhdGlvbnMgd2l0aCBoaWdoZXIgaW5jb21pbmcvb3V0Z29pbmcgZmxvd3MKcHJpbnQgKHNvcnQoZGVnKVsxOjEwXSkKYGBgCgpgYGB7cn0KIyBPY3VwcGF0aW9ucyB3aXRoIGxvd2VzdCBpbmNvbWluZy9vdXRnb2luZyBmbG93cwpwcmludCAoc29ydCgtZGVnKVsxOjEwXSkKYGBgCgpgYGB7cn0KaGlzdChkZWcsICBtYWluPSJOZXR3b3JrIE5vZGUgZGVncmVlIiwpCgpgYGAKCkRlZ3JlZSBkaXN0cmlidXRpb24KCmBgYHtyfQpkZWcuZGlzdCA8LSBkZWdyZWVfZGlzdHJpYnV0aW9uKG9jY19TVUZfbmV0LCBjdW11bGF0aXZlPVQsIG1vZGU9ImFsbCIpCgpwbG90KCB4PTA6bWF4KGRlZyksIHk9MS1kZWcuZGlzdCwgcGNoPTE5LCBjZXg9MS4yLCBjb2w9Im9yYW5nZSIsICB4bGFiPSJEZWdyZWUiLCB5bGFiPSJDdW11bGF0aXZlIEZyZXF1ZW5jeSIpCmBgYAoKU3RyZW5ndGggaXMgYSB3ZWlnaHRlZCBtZWFzdXJlIG9mIGRlZ3JlZSB0aGF0IHRha2VzIGludG8gYWNjb3VudCB0aGUgbnVtYmVyIG9mIGVkZ2VzIHRoYXQgZ28gZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyLiAKCkluIHRoaXMgZXhhbXBsZSB3ZSB1c2UgdGhlIG1vZGUgIm91dCIsIHNob3dpbmcgdGhlIG51bWJlciBvZiBqb2IgY2hhbmdlcyBsZWF2aW5nIHRoZSBvY2N1cGF0aW9uLgpgYGB7cn0Kc29ydChzdHJlbmd0aChvY2NfU1VGX25ldCxtb2RlPSJvdXQiKSlbMTo1XQoKYGBgCgpgYGB7cn0Kc29ydCgtc3RyZW5ndGgob2NjX1NVRl9uZXQpKVsxOjVdCgpgYGAKYGBge3J9Cmhpc3QoY2VudHJfZGVncmVlKG9jY19TVUZfbmV0LCBtb2RlPSJpbiIsIG5vcm1hbGl6ZWQ9VCkkcmVzLCAgbWFpbj0nQ2VudHJhbGl0eScseGxhYj0iTm9kZSBDZW50cmFsaXR5IikKY2VudHJfZGVncmVlKG9jY19TVUZfbmV0LCBtb2RlPSJpbiIsIG5vcm1hbGl6ZWQ9VCkKCmBgYApFaWdlbnZlY3RvciAoY2VudHJhbGl0eSBwcm9wb3J0aW9uYWwgdG8gdGhlIHN1bSBvZiBjb25uZWN0aW9uIGNlbnRyYWxpdGllcyksIGlzIGEgbWVhc3VyZSBvZiBiZWluZyB3ZWxsLWNvbm5lY3RlZCBjb25uZWN0ZWQgdG8gdGhlIHdlbGwtY29ubmVjdGVkLiAKVmFsdWVzIG9mIHRoZSBmaXJzdCBlaWdlbnZlY3RvciBvZiB0aGUgZ3JhcGggbWF0cml4LgoKYGBge3J9Cmhpc3QoY2VudHJfZWlnZW4ob2NjX1NVRl9uZXQsIGRpcmVjdGVkPVQsIG5vcm1hbGl6ZWQ9VCkkdmVjdG9yLCAgbWFpbj0nRWlnZW52ZWN0b3IgQ2VudHJhbGl0eScseGxhYj0iTm9kZSBFaWdlbnZlY3RvciBDZW50cmFsaXR5IikKCgpgYGAKCkNsb3NlbmVzcyAoY2VudHJhbGl0eSBiYXNlZCBvbiBkaXN0YW5jZSB0byBvdGhlcnMgaW4gdGhlIGdyYXBoKSwgbWVhc3VyZXMgaG93IG1hbnkgc3RlcHMgYXJlIHJlcXVpcmVkIHRvIGFjY2VzcyBldmVyeSBvdGhlciBub2RlIGZyb20gYSBnaXZlbiBub2RlLgpJdOKAmXMgYSBtZWFzdXJlIG9mIGhvdyBsb25nIGluZm9ybWF0aW9uIHRha2VzIHRvIGFycml2ZS4gSGlnaGVyIHZhbHVlcyBtZWFuIGxlc3MgY2VudHJhbGl0eS4KSW52ZXJzZSBvZiB0aGUgbm9kZeKAmXMgYXZlcmFnZSBnZW9kZXNpYyBkaXN0YW5jZSB0byBvdGhlcnMgaW4gdGhlIG5ldHdvcmsuCgpgYGB7cn0KCmNlbnRyX2NsbyhvY2NfU1VGX25ldCwgbW9kZT0iYWxsIiwgbm9ybWFsaXplZD1UKSAKCmhpc3QoY2VudHJfY2xvKG9jY19TVUZfbmV0LCBtb2RlPSJhbGwiLCBub3JtYWxpemVkPVQpJHJlcywgIG1haW49J0NlbnRyYWxpdHkgc2NvcmVzJyx4bGFiPSJUaGUgbm9kZS1sZXZlbCBjZW50cmFsaXR5IHNjb3Jlcy4iKQoKYGBgCgoKYGBge3J9CiMgQWxsIGNlbnRyYWxpc2F0aW9uIHR5cGVzCmNlbnRyX2RlZ3JlZShvY2NfU1VGX25ldCkkY2VudHJhbGl6YXRpb24KY2VudHJfY2xvKG9jY19TVUZfbmV0LCBtb2RlID0gImFsbCIpJGNlbnRyYWxpemF0aW9uCmNlbnRyX2JldHcob2NjX1NVRl9uZXQsIGRpcmVjdGVkID0gRkFMU0UpJGNlbnRyYWxpemF0aW9uCmNlbnRyX2VpZ2VuKG9jY19TVUZfbmV0LCBkaXJlY3RlZCA9IEZBTFNFKSRjZW50cmFsaXphdGlvbgoKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD04LCBlY2hvPUZBTFNFfQoKb2NjX1NVRl9uZXRfbm9zZWxmIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSh0b3Bfb2NjX1NVRl9kZlt0b3Bfb2NjX1NVRl9kZiRTUnQhPTEsXSxkaXJlY3RlZCA9IEZBTFNFKQoKRShvY2NfU1VGX25ldF9ub3NlbGYpJHdpZHRoIDwtIEUob2NjX1NVRl9uZXRfbm9zZWxmKSRTUnQKbGF5b3V0IDwtIGxheW91dC5mcnVjaHRlcm1hbi5yZWluZ29sZChvY2NfU1VGX25ldF9ub3NlbGYpClYob2NjX1NVRl9uZXRfbm9zZWxmKSRzaXplPWRlZ3JlZShvY2NfU1VGX25ldF9ub3NlbGYpLzEwCgpwbG90KG9jY19TVUZfbmV0X25vc2VsZiwgdmVydGV4LmxhYmVsLmNleD0wLjUsIGxheW91dCA9IGxheW91dCx2ZXJ0ZXgubGFiZWwuZm9udD0wLjUsIHZlcnRleC5sYWJlbC5jb2xvcj0iYmxhY2siLAogICAgIGVkZ2UuY29sb3I9ImdyZXkiLCBlZGdlLmN1cnZlZD0uMSkKCmBgYAoKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD04LCBlY2hvPUZBTFNFfQoKCmNlYiA8LSBjbHVzdGVyX2xvdXZhaW4ob2NjX1NVRl9uZXRfbm9zZWxmKSAKVihvY2NfU1VGX25ldF9ub3NlbGYpJGNvbW11bml0eSA8LSBjZWIkbWVtYmVyc2hpcAoKCnBsb3QoY2ViLG9jY19TVUZfbmV0X25vc2VsZiwgdmVydGV4LmxhYmVsLmNleD0uNSwgbGF5b3V0ID0gbGF5b3V0LHZlcnRleC5sYWJlbC5mb250PTAuNSwgdmVydGV4LmxhYmVsLmNvbG9yPSJibGFjayIsCiAgICAgZWRnZS5jb2xvcj0iZ3JleSIsIGVkZ2UuY3VydmVkPS4xKQoKYGBg